/*
    作者：zx
    时间：2023.2.1
    描述：设备管理层定义，屏蔽所有硬件细节
*/

#ifndef DEV_H
#define DEV_H

#define DEV_NAME_SIZE 32
// dev设备的主设备号
enum {
    DEV_UNKNOWN = 0,
    DEV_TTY,
    DEV_DISK,
};

// 设备结构体，记录设备属性，不关心具体实现，分配时再从连接上设备描述符
typedef struct _device_t
{
    struct _device_desc_t * desc;
    int mode;                   // 设备模式
    int minor;                  // 次设备号
    void * data;
    int open_count;
}device_t;

// 设备描述符，记录各种操作的具体实现，不关心是什么设备
typedef struct _device_desc_t
{
    char name[DEV_NAME_SIZE];
    int major;                  // 主设备号，设备类型（硬盘/显示器...）

    // 函数指针，指向具体实现函数？
    int (*open)(device_t * dev);
    // 设备/目的地址/需要写入的数据/大小
    int (*read)(device_t * dev, int addr, char * buff, int size);
    int (*write)(device_t * dev, int addr, char * buff, int size);
    int (*control)(device_t * dev, int cmd, int arg0, int arg1);
    void (*close)(device_t * dev);

}device_desc_t;

// 返回设备id
int dev_open(int major, int minor, void * data);
int dev_read(int dev_id, int addr, char * buff, int size);
int dev_write(int dev_id, int addr, char * buff, int size);
int dev_control(int dev_id, int cmd, int arg0, int arg1);
void dev_close(int dev_id);

#endif // !DEV_H